package com.junmeng.lib.ui.topview.core

import android.app.Activity
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup

interface IViewFactory {
    /**
     * IViewFactory的类型唯一标识，用户自定义
     * @return String
     */
    fun getType(): String

    /**
     * 用户在此返回要添加的视图
     * @param parent ViewGroup 要添加的视图的父视图
     * @param inflater LayoutInflater
     * @return View
     */
    fun onCreateView(parent: ViewGroup, inflater: LayoutInflater): View

    /**
     * 当onCreateView的视图不再使用的时候
     */
    fun onDestroyView() = Unit

    /**
     * 视图优先级，值越大越靠近用户侧
     * @return Int
     */
    fun priority(): Int = 1000_0000

    /**
     * 用户可以在此处指定视图的父view,返回的对象将作为onCreateView中的parent参数
     * @param decorView View
     * @return ViewGroup
     */
    fun getContainerView(decorView: View): ViewGroup = decorView as ViewGroup

    /**
     * 返回事件通知，如果用户需要处理此事件，则返回true,否则需返回false
     * @return Boolean
     */
    fun onBackPressed(): Boolean = false

    /**
     * 用户可在此携带一些自己的信息
     * @return Map<Any,Any>
     */
    fun userExtra(): Map<String, Any>? = null


    /**
     * 当child被添加进parent时
     * @param parent ViewGroup
     * @param child View
     */
    fun onAddIntoContainerView(parent: ViewGroup, child: View) = Unit

    /**
     * 当child从parent移除时
     * @param parent ViewGroup
     * @param child View
     */
    fun onRemoveFromContainerView(parent: ViewGroup, child: View) = Unit

    /**
     * 询问是否在目标Activity上生效，默认全部Activity都生效
     * 用户可以通过此方法决定哪些Activity会生效
     * @param target Activity 目标Activity
     * @return Boolean true--表示作用在目标Activity上，则当目标Activity展示时，会执行添加视图
     * false--表示忽略，则当目标Activity展示时，不会执行添加视图
     */
    fun askIfAppliedOnTargetActivity(target: Activity): Boolean = true

    /**
     * onCreateView产生的视图是否只应用在当前的Activity
     * 注意：如果返回true,则WindowTopViewManager.unapplyViewFactoryOnlyCurrent的作用会失效
     * @return Boolean true--视图只会添加在WindowTopViewManager.applyViewFactory调用时的Activity的window，可实现类似对话框效果
     * false--视图会添加在每个Activity的window，可实现类似悬浮窗效果
     */
    fun onlyApplyCurrent(): Boolean = false

    /**
     * 首个activity创建时
     * @param firstActivity Activity
     */
    fun onFirstActivityCreated(firstActivity: Activity) = Unit

}